package com.example.order;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@SpringBootApplication
//开启服务注册与发现，允许服务注册与发现
@EnableDiscoveryClient

//允许openfeign远程调用
@EnableFeignClients

public class OrederMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrederMainApplication.class, args);
    }

    //测试：配置监听,ApplicationRunner是一个接口，实现类可以在启动时执行一些操作，需要注册为组件bean,提供一个run方法，在项目启动时运行一次

    /**
     * 在方法上调用NacosConfigManager组件
     * @return
     */
    @Bean
    ApplicationRunner applicationRunnner(NacosConfigManager nacosConfigManager) {
        return new ApplicationRunner() {
            @Override
            public void run(org.springframework.boot.ApplicationArguments args) {
                try {
                    //nacosConfigManager.getConfigService()  获取Nacos提供的配置服务的实例对象，在这个对象中存储的就是所哟在nacos上创建的配置信息
                    ConfigService configService = nacosConfigManager.getConfigService();
                    //addListener()  监听配置信息的变化，参数1：配置信息的dataId，参数2：配置信息的group组，参数3：配置信息的监听器
                    configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {
                        @Override
                        //new listener必须实现的两个方法：线程池
                        public Executor getExecutor() {
                            return Executors.newFixedThreadPool(4);
                        }

                        @Override
                        //阿里巴巴提供的监听器的回调方法，当配置信息发生变化时，会调用这个方法，参数是配置信息的变化后的内容
                        public void receiveConfigInfo(String configInfo) {
                            System.out.println("配置信息发生变化：" + configInfo);
                        }
                    });

                    System.out.println("启动成功");
                } catch (Exception e) {
                    System.err.println("执行过程中出现异常: " + e.getMessage());
                    e.printStackTrace();
                }
            }
    };}
}
